// 数组

// 1. 数组的定义

// 定义数组的两种方式：

// 方式一：Array(1, 2, 3)
let arr1 = Array(1, 2, 3);
console.log(arr1);

// 方式二：[1, 2, 3]
let arr2 = [1, 2, 3];
console.log(arr2);

// 2. 数组的读取

// 数组变量[下标]

console.log(arr2[1]);
console.log("arr2数组的长度：", arr2.length);

// 3. 数组的遍历

// for
// forEach
// map
// filter
// every
// some
// reduce

// for of

let arr = [1, 2, 4, 5, 6, 8];

// for循环
for(let i = 0; i < arr.length; i++) {
    console.log(arr[i]);
}

// forEach() 方法

// 注意：forEach 的代码块中不能使用 break、continue，它会抛出异常。

arr.forEach(function(value, index, array){
    console.log(index, value, array);
});

// map() 方法：返回新的数组。
arr.map(function(value, index){
    console.log(index, value);
});

let resultArr1 = arr.map(function(value, index){
    return value * value;
});

console.log(resultArr1);


// filter() 方法：返回新的数组，返回符合回调函数指定条件的元素数组。
let resultArr2 = arr.filter(function(value, index){
    return value % 2 === 0;
});

console.log(resultArr2);

// some() 方法

let resultArr3 = arr.some(function(value, index){
    return value === 2;
});

console.log(resultArr3);

// every() 方法
let resultArr4 = arr.every(function(value, index){
    return value % 2 === 0;
});

console.log(resultArr4);

// reduce() 方法

// reduce 方法的参数也是一个回调函数，这个回调函数一共有4个参数：
// 1. prevValue：上一次回调返回的值
// 2. current：数组中当前被处理的元素
// 3. index：当前元素在数组中的索引
// 4. array：调用 reduce 的数组


let resultArr5 = arr.reduce(function(prevValue, current, index, array){
    return prevValue + current;
});

console.log(resultArr5);

// for...of 是支持 break、continue、return 的，所以在功能上非常贴近原生的 for。

let arr4 = [1, 2, 3];

for (let item of arr4) {
    console.log(item);
}

for (let value of arr4.values()) {
    console.log(value);
}

for (let index of arr4.keys()) {
    console.log(index);
}

for (let [index, value] of arr4.entries()) {
    console.log(index, value);
}